/*
 * @Author: 码农 2646995216@qq.com
 * @Date: 2025-03-22 13:57:05
 * @LastEditors: 码农 2646995216@qq.com
 * @LastEditTime: 2025-03-25 00:03:09
 * @FilePath: /http/httpservermain.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include"httpserver.hpp"
#include<memory>
#include"ios.hpp"

//根据网络文件的后缀，来确定"Content_Type"的类型
string suffixToDesc(const string suffix)
{
    string ct="Content_Type: ";
    if(suffix==".png")
    {
        ct+="application/x-png";
    }
    else if(suffix==".html")
    {
        ct+="text/html";
    }
    ct+="\r\n";
    return ct;
}

//将请求给回应，并且将请求打印
void Delreq(const HttpRequest& req, HttpResponse& resp)
{
    cout << "------------------http start------------------" << endl;
    cout << req.inbuffer<<endl;                         //完整请求
    cout<<"反序列化后，成员的值"<<endl;
    cout<<"method: "<<req.method<<endl;           //请求方法
    cout<<"url: "<<req.url<<endl;                 //请求url
    cout<<"httpversion: "<<req.httpversion<<endl; //请求版本
    cout<<"请求网络文件路径: "<<req.path<<endl;    //请求网络文件路径
    cout<<"请求网络文件大小: "<<req.size<<endl;    //请求网络文件大小
    cout << "------------------http end------------------" << endl;
    

    //客户端自己会打印resp
    string resp_line = "HTTP/1.1 200 OK\r\n";//构造状态行
    //设置响应的类型，将响应发给浏览器，并告诉浏览器文件类型，text/html：表示文件为html的文档
    string resp_hander=suffixToDesc(req.suffix);//根据文件类型构造Content-Type

    //构造Content-Length
    string resp_len="Content-Length: ";
    resp_len+=to_string(req.size);
    resp_len+="\r\n";
    
    string resp_black = "\r\n";//构造空行
    string resp_body;//响应正文
    
    resp_body.resize(req.size+1);//开辟响应正文的大小，比网络文件的大小加一，可以将网络文件全部存储到响应正文中
    
    //将该路径下网络文件的代码，全部存储在resp_body中，也就是放入响应正文中
    if(!Util::readfile(req.path,(char*)resp_body.c_str(),req.size))
    {
        //如果读取失败，则将html_404文件的代码，放入响应正文中
        Util::readfile(html_404,(char*)resp_body.c_str(),req.size);
    }

    //响应序列化，即把它们按顺序拼接好
    resp.outbuffer += resp_line;
    resp.outbuffer += resp_hander;
    resp.outbuffer += resp_len;
    resp.outbuffer += resp_black;
    resp.outbuffer += resp_body;
}


int main(int args,char* argv[])
{
	uint16_t port=stoi(argv[1]);

	unique_ptr<HttpServer> p(new HttpServer(Delreq,port));
	p->Init();
	p->Start();


	return 0;
}